"""
Flask示例应用运行器 - 统一管理和运行所有Flask示例
提供菜单选择不同的示例应用进行演示
"""

import os
import sys
import subprocess
import time
from typing import Dict, List

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))


class FlaskExampleRunner:
    """Flask示例运行器"""
    
    def __init__(self):
        self.examples_dir = os.path.dirname(os.path.abspath(__file__))
        self.examples = {
            "1": {
                "name": "基础API示例",
                "file": "flask_basic_api.py",
                "port": 5001,
                "description": "用户管理、认证和基础CRUD操作"
            },
            "2": {
                "name": "缓存系统示例",
                "file": "flask_cache_demo.py",
                "port": 5002,
                "description": "Redis和内存缓存、缓存策略和管理"
            },
            "3": {
                "name": "认证系统示例",
                "file": "flask_auth_demo.py",
                "port": 5003,
                "description": "JWT认证、权限控制和用户管理"
            },
            "4": {
                "name": "HTTP客户端示例",
                "file": "flask_http_client_demo.py",
                "port": 5004,
                "description": "同步/异步HTTP请求、重试机制、文件上传"
            },
            "5": {
                "name": "数据库操作示例",
                "file": "flask_database_demo.py",
                "port": 5005,
                "description": "ORM模型、仓储模式和服务层"
            },
            "6": {
                "name": "日志系统示例",
                "file": "flask_logging_demo.py",
                "port": 5006,
                "description": "结构化日志、日志级别、审计日志"
            },
            "7": {
                "name": "工具函数示例",
                "file": "flask_utils_demo.py",
                "port": 5007,
                "description": "数据验证、格式化、加密、文件处理"
            },
            "8": {
                "name": "综合功能示例",
                "file": "flask_comprehensive_demo.py",
                "port": 5008,
                "description": "整合所有功能的完整业务场景"
            },
            "9": {
                "name": "API测试工具",
                "file": "flask_api_testing_tool.py",
                "port": 5009,
                "description": "API测试、性能监控和负载测试"
            },
            "10": {
                "name": "微服务架构示例",
                "file": "flask_microservice_demo.py",
                "port": 5010,
                "description": "微服务架构、服务间通信、事件驱动"
            },
            "11": {
                "name": "WebSocket实时通信",
                "file": "flask_websocket_demo.py",
                "port": 5011,
                "description": "实时聊天、通知推送、房间管理"
            },
            "12": {
                "name": "任务队列和后台作业",
                "file": "flask_task_queue_demo.py",
                "port": 5014,
                "description": "异步任务处理、定时任务、任务监控"
            },
            "13": {
                "name": "文件管理和存储",
                "file": "flask_file_storage_demo.py",
                "port": 5015,
                "description": "文件上传下载、存储管理、文件处理"
            }
        }
    
    def display_menu(self):
        """显示菜单"""
        print("=" * 80)
        print("🚀 Python Backend Toolkit - Flask示例应用运行器")
        print("=" * 80)
        print("请选择要运行的示例应用:")
        print()
        
        for key, example in self.examples.items():
            print(f"  {key:2}. {example['name']:<20} (端口: {example['port']})")
            print(f"      📝 {example['description']}")
            print()
        
        print("  0.  退出程序")
        print("=" * 80)
    
    def run_example(self, choice: str):
        """运行选择的示例"""
        if choice == "0":
            print("👋 感谢使用，再见！")
            return False
        
        if choice not in self.examples:
            print("❌ 无效选择，请重新输入")
            return True
        
        example = self.examples[choice]
        file_path = os.path.join(self.examples_dir, example["file"])
        
        if not os.path.exists(file_path):
            print(f"❌ 示例文件不存在: {example['file']}")
            return True
        
        print(f"🚀 启动示例: {example['name']}")
        print(f"📁 文件: {example['file']}")
        print(f"🌐 端口: {example['port']}")
        print(f"📝 描述: {example['description']}")
        print()
        print("💡 提示:")
        print(f"   - 应用将在 http://localhost:{example['port']} 启动")
        print("   - 按 Ctrl+C 停止应用")
        print("   - 查看 /info 端点获取API文档")
        print("   - 查看 /health 端点进行健康检查")
        print()
        
        try:
            # 运行示例应用
            subprocess.run([sys.executable, file_path], cwd=self.examples_dir)
        except KeyboardInterrupt:
            print("\n🛑 应用已停止")
        except Exception as e:
            print(f"❌ 运行示例时出错: {e}")
        
        print("\n" + "=" * 50)
        input("按回车键返回主菜单...")
        return True
    
    def check_dependencies(self):
        """检查依赖"""
        print("🔍 检查依赖包...")
        
        # 包名映射（导入名 -> 包名）
        package_mapping = {
            'flask': 'flask',
            'sqlalchemy': 'sqlalchemy', 
            'redis': 'redis',
            'httpx': 'httpx',
            'PIL': 'pillow',
            'schedule': 'schedule',
            'flask_socketio': 'flask-socketio'
        }
        
        missing_packages = []
        
        for import_name, package_name in package_mapping.items():
            try:
                __import__(import_name)
                print(f"  ✅ {package_name}")
            except ImportError:
                missing_packages.append(package_name)
                print(f"  ❌ {package_name}")
        
        if missing_packages:
            print(f"\n⚠️  缺少依赖包: {', '.join(missing_packages)}")
            print("请运行以下命令安装:")
            print(f"pip install {' '.join(missing_packages)}")
            print("\n或者安装完整依赖:")
            print("pip install -r requirements.txt")
            return False
        
        print("✅ 所有依赖包已安装")
        return True
    
    def show_project_structure(self):
        """显示项目结构"""
        print("\n📁 项目结构:")
        print("""
python_backend_toolkit/
├── 📁 api/              # API基础组件
│   ├── base.py          # 基础API类
│   ├── exceptions.py    # 异常处理
│   ├── middleware.py    # 中间件
│   └── responses.py     # 响应格式
├── 📁 auth/             # 认证模块
│   ├── auth_service.py  # 认证服务
│   ├── jwt_handler.py   # JWT处理
│   ├── models.py        # 认证模型
│   └── password_handler.py # 密码处理
├── 📁 cache/            # 缓存模块
│   ├── cache_service.py # 缓存服务
│   ├── decorators.py    # 缓存装饰器
│   └── redis_cache.py   # Redis缓存
├── 📁 database/         # 数据库模块
│   ├── base.py          # 基础模型
│   ├── repository.py    # 仓储模式
│   ├── service.py       # 服务层
│   └── session.py       # 数据库会话
├── 📁 http_client/      # HTTP客户端
│   ├── async_client.py  # 异步客户端
│   └── models.py        # 请求响应模型
├── 📁 logging/          # 日志模块
│   ├── formatters.py    # 日志格式化
│   ├── logger.py        # 日志器
│   └── middleware.py    # 日志中间件
├── 📁 utils/            # 工具模块
│   ├── decorators.py    # 装饰器
│   ├── helpers.py       # 辅助函数
│   ├── pagination.py    # 分页工具
│   └── validators.py    # 验证器
└── 📁 examples/         # 示例应用
    ├── flask_basic_api.py        # 基础API示例
    ├── flask_cache_demo.py       # 缓存示例
    ├── flask_auth_demo.py        # 认证示例
    ├── flask_http_client_demo.py # HTTP客户端示例
    ├── flask_database_demo.py    # 数据库示例
    ├── flask_logging_demo.py     # 日志示例
    ├── flask_utils_demo.py       # 工具示例
    ├── flask_comprehensive_demo.py # 综合示例
    ├── flask_api_testing_tool.py # API测试工具
    ├── flask_microservice_demo.py # 微服务示例
    ├── flask_websocket_demo.py   # WebSocket示例
    ├── flask_task_queue_demo.py  # 任务队列示例
    └── flask_file_storage_demo.py # 文件存储示例
        """)
    
    def run(self):
        """运行主程序"""
        # 检查依赖
        if not self.check_dependencies():
            return
        
        # 显示项目结构
        self.show_project_structure()
        
        # 主循环
        while True:
            self.display_menu()
            choice = input("请输入选择 (0-13): ").strip()
            
            if not self.run_example(choice):
                break


def main():
    """主函数"""
    runner = FlaskExampleRunner()
    runner.run()


if __name__ == "__main__":
    main()